
#include "utils.h"

String hex2str(uint8_t *buf, uint16_t len)
{
    String str = "";
    char c[] = "0123456789abcdef";
    for (int i = 0; i < len; i++)
    {
        str += c[buf[i] >> 4];
        str += c[buf[i] & 0xf];
    }
    return str;
}
#define isDigit(c) (((c) <= '9' && (c) >= '0') ? (1) : (0))

static uint8_t hex2dec(char hex)
{
    if (isDigit(hex))
    {
        return (hex - '0');
    }
    if (hex >= 'a' && hex <= 'f')
    {
        return (hex - 'a' + 10);
    }
    if (hex >= 'A' && hex <= 'F')
    {
        return (hex - 'A' + 10);
    }

    return 0;
}

int str2hex(String str, unsigned char *output, int max_len)
{
    int i = 0;
    uint8_t ch0, ch1;
    uint16_t len = str.length();
    if (len % 2 != 0)
    {
        return -1;
    }
    while (i < len / 2 && i < max_len)
    {
        ch0 = hex2dec((char)str.c_str()[2 * i]);
        ch1 = hex2dec((char)str.c_str()[2 * i + 1]);
        output[i] = (ch0 << 4 | ch1);
        i++;
    }
    return i;
}

// 校验字符串是否为合法的IP地址，并转换为IPAddress类型
bool stringToIPAddress(const String &ipString, IPAddress &ip)
{
    int dots = 0;
    int parts[4];
    int partIndex = 0;
    String currentPart = "";

    // 遍历字符串中的每个字符
    for (int i = 0; i < ipString.length(); i++)
    {
        char c = ipString.charAt(i);
        if (c == '.')
        {
            // 遇到点号，尝试将当前部分转换为整数
            if (partIndex >= 4)
            {
                return false; // 超过4个部分，非法
            }
            if (currentPart.length() == 0)
            {
                return false; // 部分为空，非法
            }
            parts[partIndex++] = currentPart.toInt();
            currentPart = "";
            dots++;
        }
        else if (isdigit(c))
        {
            // 如果是数字，添加到当前部分
            currentPart += c;
        }
        else
        {
            return false; // 非数字和点号，非法
        }
    }

    // 处理最后一个部分
    if (partIndex != 3 || currentPart.length() == 0)
    {
        return false;
    }
    parts[partIndex] = currentPart.toInt();

    // 检查点号数量是否为3
    if (dots != 3)
    {
        return false;
    }

    // 检查每个部分的值是否在0-255范围内
    for (int i = 0; i < 4; i++)
    {
        if (parts[i] < 0 || parts[i] > 255)
        {
            return false;
        }
    }

    // 将合法的IP地址赋值给IPAddress对象
    ip = IPAddress(parts[0], parts[1], parts[2], parts[3]);
    return true;
}